package com.zzw.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;

/**
 * 异步任务工具类
 * 演示如何使用Spring容器中的线程池执行异步任务
 */
@Component
public class AsyncTaskUtils {

    private static final Logger logger = LoggerFactory.getLogger(AsyncTaskUtils.class);

    /**
     * 执行异步任务，不需要返回结果
     * 通过@Async注解，该方法会被Spring在线程池中异步执行
     *
     * @param taskName 任务名称
     */
    @Async("taskExecutor")
    public void executeAsyncTask(String taskName) {
        logger.info("开始执行异步任务: {}", taskName);
        try {
            // 模拟耗时任务
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("异步任务执行被中断: {}", e.getMessage());
        }
        logger.info("异步任务执行完成: {}, 线程名: {}", taskName, Thread.currentThread().getName());
    }

    /**
     * 执行异步任务并返回结果
     * 使用CompletableFuture返回异步执行的结果
     *
     * @param taskName 任务名称
     * @return 包含任务执行结果的CompletableFuture对象
     */
    @Async("taskExecutor")
    public CompletableFuture<String> executeAsyncTaskWithResult(String taskName) {
        logger.info("开始执行有返回值的异步任务: {}", taskName);
        try {
            // 模拟耗时任务
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("异步任务执行被中断: {}", e.getMessage());
            return CompletableFuture.completedFuture("任务执行失败: " + taskName);
        }

        String result = "任务[" + taskName + "]执行完成，线程名: " + Thread.currentThread().getName();
        logger.info(result);

        // 返回CompletableFuture对象，包含任务执行结果
        return CompletableFuture.completedFuture(result);
    }

    /**
     * 批量执行多个异步任务
     *
     * @param taskCount 任务数量
     * @return 包含所有任务执行结果的CompletableFuture数组
     */
    public CompletableFuture<String>[] executeMultipleAsyncTasks(int taskCount) {
        logger.info("开始执行批量异步任务，总数: {}", taskCount);

        @SuppressWarnings("unchecked")
        CompletableFuture<String>[] futures = new CompletableFuture[taskCount];

        for (int i = 0; i < taskCount; i++) {
            String taskName = "批量任务-" + (i + 1);
            futures[i] = executeAsyncTaskWithResult(taskName);
        }

        // 所有任务完成后的处理
        CompletableFuture.allOf(futures).thenRun(() ->
                logger.info("所有批量异步任务已完成，总数: {}", taskCount)
        );

        return futures;
    }
}
